package com.bkhech.home.practice.javacore.core.浮点数比较;

import java.math.BigDecimal;

/**
 * 浮点数比较
 * <p>
 * 该问题来源于一道面试题： float如何判断是否为0？
 *
 * float、double分别遵循R32-24、R64-53标准。他们尾数的位数分别是23、52，即误差在2的-23和2的-52次方，所以
 * float的精度误差在1e-6，double的精度误差在1e-15.
 *
 * 要判读一个单精度浮点数是否等于0：if(fabs(f) <= 1e-6);
 * 要判断一个双精度浮点数是否等于0：if(fabs(d) <= 1e-15);
 * 要判断两个单精度浮点数是否相等：if(fabs(f1 - f2) <= 1e-6);
 * 要判断两个双精度浮点数是否相等：if(fabs(d1 - d2) <= 1e-15);
 *
 * @author guowm
 * @date 2023/1/7
 */
public class FloatOrDoubleDemo {
    public static void main(String[] args) {
        // 即 1乘以10的-6次方
        double a = 1e-6;
        double a1 = Math.pow(10, -6);
        // 浮点数只能近似的表示实数运算
        // 0.000000999999999999999954748111825886258685613938723690807819366455078125
        // 相等
        System.out.println(new BigDecimal(a).toPlainString());
        System.out.println(new BigDecimal(a1).toPlainString());

        double b = 0.3;
        double c = 0.1 + 0.2;
        // false
        System.out.println(b == c);

        boolean ret = b -c <= 1e-6;
        System.out.println(b -c);
        // true
        System.out.println(ret);

    }
}
